#include <iostream>
#include <vector>
using namespace std;

const int MOD = 1000000007; // 定义模数

vector<int> tree[200001]; // 存储树的邻接表
long long dp[200001][2];  // dp[i][0] 表示不选 i，dp[i][1] 表示选 i

// 深度优先搜索函数
void dfs(int node, int parent) {
  dp[node][0] = 1; // 不选当前节点时，独立集数量为 1（空集）
  dp[node][1] = 1; // 选当前节点时，独立集数量为 1（只包含当前节点）

  // 遍历当前节点的所有子节点
  for (int child : tree[node]) {
    if (child == parent)
      continue; // 避免回到父节点
    dfs(child, node); // 递归 DFS 访问子节点
    // 不选当前节点时，子节点可以选或不选
    dp[node][0] = dp[node][0] * (dp[child][0] + dp[child][1]) % MOD; 
    // 选当前节点时，子节点不能选
    dp[node][1] = dp[node][1] * dp[child][0] % MOD; 
  }
}

int main() {
  int n;
  cin >> n; // 输入节点数量

  // 构建树的邻接表
  for (int i = 2; i <= n; i++) {
    int p;
    cin >> p; // 输入父节点
    tree[p].push_back(i); // 将子节点添加到父节点的邻接表
    tree[i].push_back(p); // 将父节点添加到子节点的邻接表（无向图）
  }

  dfs(1, -1);                          // 从根节点开始 DFS
  // 输出结果：根节点的独立集数量（选或不选根节点）
  cout << (dp[1][0] + dp[1][1]) % MOD; 
  return 0;
}
